﻿#include <cstdlib>
#include <iostream>
#include <string>
#include <format>
#include "httplib.h"
#include "sqlite3.h"
#include "db_process.h"
#include "nlohmann/json.hpp"  // 需要引入JSON库，如nlohmann/json

// typedef struct _data {
//     std::string id;
//     std::string name;
//     bool admin;
//     std::string password;
// }DATA;

// static DATA gData;

// static int callback(void *NotUsed, int argc, char **argv, char **azColName){
//     int i;
//     for(i=0; i<argc; i++){
//         if (std::string(azColName[i]) == "id") gData.id = argv[i] ? argv[i] : "NULL";
//         if (std::string(azColName[i]) == "name") gData.name = argv[i] ? argv[i] : "NULL";
//         if (std::string(azColName[i]) == "role") gData.admin = argv[i] ? argv[i] : false;
//         if (std::string(azColName[i]) == "password") gData.password = argv[i] ? argv[i] : "NULL";
//     }    

//     return 0;  
// }


// 使用nlohmann/json库处理JSON数据
using json = nlohmann::json;


int main(int argc, char* argv[]) {

    sqlite3 *db;
    int rc = sqlite3_open("./timebank.db", &db);

    // create_user_table(db);
    // create_time_table(db);
    // insert_user(db, "admin", 1, "qwe123!@");
    // insert_user(db, "张宸煜", 0, "123");
    // modify_time(db, 10);
    // sqlite3_close(db);
    // return 0;


    
    // 创建HTTP服务器，监听8080端口
    httplib::Server svr;
    svr.set_mount_point("/", "./client");
    
    

    // 添加CORS支持 - 关键部分
    svr.set_pre_routing_handler([](const httplib::Request& req, httplib::Response& res) {
        // 允许所有来源访问，生产环境中应指定具体域名
        res.set_header("Access-Control-Allow-Origin", "*");
        // 允许的HTTP方法
        res.set_header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        // 允许的请求头
        res.set_header("Access-Control-Allow-Headers", "Content-Type, Authorization");
        
        // 处理预检请求
        if (req.method == "OPTIONS") {
            res.status = 200;
            return httplib::Server::HandlerResponse::Handled;
        }
        
        return httplib::Server::HandlerResponse::Unhandled;
    });

    
    // 处理GET /user请求
    svr.Get("/user", [db](const httplib::Request& req, httplib::Response& res) {
        // 从查询参数中获取user_id
        auto user_id = req.get_param_value("user_id");
        auto pwd = req.get_param_value("pwd");
        std::cout << "user -> "<< user_id << std::endl;
        
        if (user_id.empty()) {
            // 如果没有提供user_id，返回400错误
            res.status = 400;
            res.set_content("Missing user_id parameter", "text/plain");
            return;
        }

        sqlite3_stmt* stmt = get_user(db, user_id);
        if (sqlite3_step(stmt) == SQLITE_ROW) {
            int id = sqlite3_column_int(stmt, 0);
            const char *name = (const char*)sqlite3_column_text(stmt, 1); // 字符串类型
            int admin = sqlite3_column_int(stmt, 2);                 // 整数类型
            const char* password = (const char*)sqlite3_column_text(stmt, 3);        // 字符串类型
            bool active = false;
            if (pwd == std::string(password)) {
                active = true;
            }

            int time = 0;
            if (active) {
                sqlite3_stmt* stmt = get_time(db);

                if (sqlite3_step(stmt) == SQLITE_ROW) {
                    int id = sqlite3_column_int(stmt, 0);
                    time = sqlite3_column_int(stmt, 1); // 整数类型
                }
            }

            // 返回JSON格式的响应，因为前端在用response.json()解析
            auto content = std::format("{{\"user_id\": \"{}\", \"admin\": \"{}\", \"active\": \"{}\", \"available_time\": \"{}\"}}", user_id, admin ? "Y" : "N", active ? "Y" : "N", time);
            res.set_content(
                content,
                "application/json"  // 重要：指定为JSON类型
            );
        }
        
    });

    // 处理/deposit路径的POST请求
    svr.Post("/deposit", [db](const httplib::Request& req, httplib::Response& res) {
        try {
            // 1. 验证请求头是否为JSON类型
            if (req.get_header_value("Content-Type") != "application/json") {
                res.status = 415;  // 不支持的媒体类型
                res.set_content(R"({"error": "Unsupported Media Type. Use application/json"})", 
                               "application/json");
                return;
            }

            // 2. 解析JSON请求体
            json req_data = json::parse(req.body);

            // 3. 验证是否包含minutes字段
            if (!req_data.contains("minutes")) {
                res.status = 400;  // 错误的请求
                res.set_content(R"({"error": "Missing 'minutes' field"})", 
                               "application/json");
                return;
            }

            // 4. 获取minutes值并进行处理
            int minutes = req_data["minutes"].get<int>();
            
            // 这里可以添加实际业务逻辑，比如处理存款时间等
            // int result = minutes * 60;  // 示例：转换为秒
            
            sqlite3_stmt* stmt = get_time(db);

            int time = 0;
            if (sqlite3_step(stmt) == SQLITE_ROW) {
                int id = sqlite3_column_int(stmt, 0);
                time = sqlite3_column_int(stmt, 1); // 整数类型
            }
            time += minutes;
            update_time(db, time);

            // 返回JSON格式的响应，因为前端在用response.json()解析
            auto content = std::format("{{\"available_time\": \"{}\"}}", time);
            std::cout << content << std::endl;
            res.set_content(
                content,
                "application/json"  // 重要：指定为JSON类型
            );
            res.status = 200;  // 成功
        } catch (const json::parse_error& e) {
            // 处理JSON解析错误
            res.status = 400;
            res.set_content(R"({"error": "Invalid JSON format"})", "application/json");
        } catch (const std::exception& e) {
            // 处理其他异常
            res.status = 500;
            res.set_content(R"({"error": "Internal server error"})", "application/json");
        }
    });


    // 处理/deposit路径的POST请求
    svr.Post("/withdraw", [db](const httplib::Request& req, httplib::Response& res) {
        try {
            // 1. 验证请求头是否为JSON类型
            if (req.get_header_value("Content-Type") != "application/json") {
                res.status = 415;  // 不支持的媒体类型
                res.set_content(R"({"error": "Unsupported Media Type. Use application/json"})", 
                               "application/json");
                return;
            }

            // 2. 解析JSON请求体
            json req_data = json::parse(req.body);

            // 3. 验证是否包含minutes字段
            if (!req_data.contains("minutes")) {
                res.status = 400;  // 错误的请求
                res.set_content(R"({"error": "Missing 'minutes' field"})", 
                               "application/json");
                return;
            }

            // 4. 获取minutes值并进行处理
            int minutes = req_data["minutes"].get<int>();
            
            // 这里可以添加实际业务逻辑，比如处理存款时间等
            // int result = minutes * 60;  // 示例：转换为秒
            
            sqlite3_stmt* stmt = get_time(db);

            int time = 0;
            if (sqlite3_step(stmt) == SQLITE_ROW) {
                int id = sqlite3_column_int(stmt, 0);
                time = sqlite3_column_int(stmt, 1); // 整数类型
            }
            time -= minutes;
            if(time < 0) time = 0;
            update_time(db, time);

            // 返回JSON格式的响应，因为前端在用response.json()解析
            auto content = std::format("{{\"available_time\": \"{}\"}}", time);
            std::cout << content << std::endl;
            res.set_content(
                content,
                "application/json"  // 重要：指定为JSON类型
            );
            res.status = 200;  // 成功
        } catch (const json::parse_error& e) {
            // 处理JSON解析错误
            res.status = 400;
            res.set_content(R"({"error": "Invalid JSON format"})", "application/json");
        } catch (const std::exception& e) {
            // 处理其他异常
            res.status = 500;
            res.set_content(R"({"error": "Internal server error"})", "application/json");
        }
    });

    // 启动服务器
    std::cout << "Server starting on port 8080..." << std::endl;
    if (svr.listen("0.0.0.0", 8080)) {  // 监听所有网络接口
        std::cout << "Server started successfully" << std::endl;
    } else {
        std::cerr << "Failed to start server" << std::endl;
        sqlite3_close(db);
        return EXIT_FAILURE;
    }

    sqlite3_close(db);

    return EXIT_SUCCESS;
}
